home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 November / Macworld (1999-11).dmg / Updaters / WhiteCap 3.0.4 / WhiteCap Source.sit / WhiteCap Source / Common / math / Headers / ExprVirtualMachine.h < prev    next >
Text File  |  1999-07-13  |  3KB  |  110 lines

  1. #ifndef ExprVirtualMachine_
  2. #define ExprVirtualMachine_
  3.  
  4. #include "UtilStr.h"
  5.  
  6.  
  7. // Valid math fcn calls for MathOp()
  8. enum {
  9.     cSQRT    = 30,
  10.     cATAN    = 31,
  11.     cABS    = 32,
  12.     cSIN    = 33,
  13.     cCOS    = 34,
  14.     cTAN    = 35,
  15.     cLOG    = 36,
  16.     cEXP    = 37,
  17.     cSQR    = 38,
  18.     cSQWV    = 39,
  19.     cPOS    = 40,
  20.     cRND    = 41,
  21.     cSGN    = 42,
  22.     cTRWV    = 43,
  23.     cCLIP    = 44,
  24.     cSEED    = 45
  25.     
  26. };
  27.  
  28.  
  29.  
  30.         
  31. class ExprVirtualMachine {
  32.  
  33.  
  34.     public: 
  35.                             ExprVirtualMachine();
  36.                             
  37.         // Effectively copies inVM into this
  38.         void                Assign( ExprVirtualMachine& inVM );
  39.             
  40.         // Clears the current program
  41.         void                Clear();
  42.         
  43.         //    Call this once after new instructions are added
  44.         void                PrepForExecution();
  45.         
  46.         //    Executes the current program loaded.  FP register zero is returned.
  47.         float                Execute(); //                                                                    { return Execute_Inline();                    }
  48.         //inline float        Execute_Inline();
  49.  
  50.         // Performs the op: FP[ inReg ] <- FP[ inReg ] <op> FP[ inReg2 ]
  51.         // inReg is from 0 to 3, and inOpCode can be +,-,*,/,^,%
  52.         void                DoOp( int inReg, int inReg2, char inOpCode );
  53.         
  54.         // Moves the value of register zero to some other register
  55.         void                 Move( int inReg, int inDestReg );
  56.         
  57.         // Sets the value of register zero
  58.         void                Loadi( float inVal, int inReg );
  59.         
  60.         // Sets the value of register zero, forever tying this VM to inVal until it's Cleared
  61.         // Note:     This VM must be Cleared or deleted before the inVal becomes invalid!  Otherwise,
  62.         //            they'll be a dangling pointer in this VM!
  63.         void                Loadi( float* inVal, int inReg );
  64.         
  65.         // Perfroms one of the above fcns on register zero
  66.         void                MathOp( int inReg, char inFcnCode );
  67.         
  68.         //    Allows a piecewise user functions
  69.         void                UserFcnOp( int inReg, float** inFcnH, long inSize );
  70.         
  71.         // Use these to access/use a register/memory space
  72.         int                    AllocReg();
  73.         void                DeallocReg( int inReg );
  74.         
  75.         // Returns a register that's globally free (ie, a reg that's never touched during Execute())
  76.         int                    FindGlobalFreeReg();
  77.         
  78.         /* Makes a copy of inVM and each call to Execute() from now on is equivilent to:
  79.         float v1 = this.Execute();
  80.         float v2 = inVM.Execute();
  81.         return ( *inTransitionLink ) * v1 + ( 1 - *inTransitionLink ) * v2;  */
  82.         void                Chain( ExprVirtualMachine& inVM, float* inTransitionLink );
  83.                 
  84.     protected:
  85.         
  86.         enum {
  87.             OP_LOADIMMED    = 0x02000000,
  88.             OP_LOAD            = 0x03000000,
  89.             OP_OPER            = 0x04000000,
  90.             OP_MATHOP        = 0x05000000,
  91.             OP_USER_FCN        = 0x06000000,
  92.             OP_MOVE            = 0x0A000000,
  93.             OP_WEIGHT        = 0x0B000000,
  94.             
  95.             
  96.             NUM_REGS        = 32,
  97.             NUM_PHYS_REGS    = 8
  98.         };
  99.         
  100.         UtilStr                mProgram;
  101.         char                mRegColor[ NUM_REGS ];
  102.         
  103.         // Simple shortcut ptrs to save time.
  104.         const char*            mPCStart;
  105.         const char*            mPCEnd;
  106.  
  107. };
  108.  
  109.  
  110. #endif